/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                        Intel License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of Intel Corporation may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

#ifndef __LINUX_VIDEODEV_H
#define __LINUX_VIDEODEV_H

#ifdef __cplusplus
extern "C" {
#endif

#include <linux/types.h>
#include <linux/version.h>

#ifdef __KERNEL__

#if LINUX_VERSION_CODE >= 0x020100
#include <linux/poll.h>
#endif

struct video_device
{
    char name[32];
    int type;
    int hardware;

    int (*open)(struct video_device *, int mode);
    void (*close)(struct video_device *);
    long (*read)(struct video_device *, char *, unsigned long, int noblock);
    /* Do we need a write method ? */
    long (*write)(struct video_device *, const char *, unsigned long, int noblock);
#if LINUX_VERSION_CODE >= 0x020100
    unsigned int (*poll)(struct video_device *, struct file *, poll_table *);
#endif
    int (*ioctl)(struct video_device *, unsigned int , void *);
    int (*mmap)(struct video_device *, const char *, unsigned long);
    int (*initialize)(struct video_device *);   
    void *priv;     /* Used to be 'private' but that upsets C++ */
    int busy;
    int minor;
};

extern int videodev_init(void);
#define VIDEO_MAJOR 81
extern int video_register_device(struct video_device *, int type);

#define VFL_TYPE_GRABBER    0
#define VFL_TYPE_VBI        1
#define VFL_TYPE_RADIO      2
#define VFL_TYPE_VTX        3

extern void video_unregister_device(struct video_device *);
#endif


#define VID_TYPE_CAPTURE    1   /* Can capture */
#define VID_TYPE_TUNER      2   /* Can tune */
#define VID_TYPE_TELETEXT   4   /* Does teletext */
#define VID_TYPE_OVERLAY    8   /* Overlay onto frame buffer */
#define VID_TYPE_CHROMAKEY  16  /* Overlay by chromakey */
#define VID_TYPE_CLIPPING   32  /* Can clip */
#define VID_TYPE_FRAMERAM   64  /* Uses the frame buffer memory */
#define VID_TYPE_SCALES     128 /* Scalable */
#define VID_TYPE_MONOCHROME 256 /* Monochrome only */
#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */

struct video_capability
{
    char name[32];
    int type;
    int channels;   /* Num channels */
    int audios; /* Num audio devices */
    int maxwidth;   /* Supported width */
    int maxheight;  /* And height */
    int minwidth;   /* Supported width */
    int minheight;  /* And height */
};


struct video_channel
{
    int channel;
    char name[32];
    int tuners;
    __u32  flags;
#define VIDEO_VC_TUNER      1   /* Channel has a tuner */
#define VIDEO_VC_AUDIO      2   /* Channel has audio */
    __u16  type;
#define VIDEO_TYPE_TV       1
#define VIDEO_TYPE_CAMERA   2   
    __u16 norm;         /* Norm set by channel */
};

struct video_tuner
{
    int tuner;
    char name[32];
    __u32 rangelow, rangehigh;  /* Tuner range */
    __u32 flags;
#define VIDEO_TUNER_PAL     1
#define VIDEO_TUNER_NTSC    2
#define VIDEO_TUNER_SECAM   4
#define VIDEO_TUNER_LOW     8   /* Uses KHz not MHz */
#define VIDEO_TUNER_NORM    16  /* Tuner can set norm */
#define VIDEO_TUNER_STEREO_ON   128 /* Tuner is seeing stereo */
#define VIDEO_TUNER_RDS_ON      256     /* Tuner is seeing an RDS datastream */
#define VIDEO_TUNER_MBS_ON      512     /* Tuner is seeing an MBS datastream */
    __u16 mode;         /* PAL/NTSC/SECAM/OTHER */
#define VIDEO_MODE_PAL      0
#define VIDEO_MODE_NTSC     1
#define VIDEO_MODE_SECAM    2
#define VIDEO_MODE_AUTO     3
    __u16 signal;           /* Signal strength 16bit scale */
};

struct video_picture
{
    __u16   brightness;
    __u16   hue;
    __u16   colour;
    __u16   contrast;
    __u16   whiteness;  /* Black and white only */
    __u16   depth;      /* Capture depth */
    __u16   palette;    /* Palette in use */
#define VIDEO_PALETTE_GREY      1   /* Linear greyscale */
#define VIDEO_PALETTE_HI240     2   /* High 240 cube (BT848) */
#define VIDEO_PALETTE_RGB565    3   /* 565 16 bit RGB */
#define VIDEO_PALETTE_RGB24     4   /* 24bit RGB */
#define VIDEO_PALETTE_RGB32     5   /* 32bit RGB */ 
#define VIDEO_PALETTE_RGB555    6   /* 555 15bit RGB */
#define VIDEO_PALETTE_YUV422    7   /* YUV422 capture */
#define VIDEO_PALETTE_YUYV      8
#define VIDEO_PALETTE_UYVY      9   /* The great thing about standards is ... */
#define VIDEO_PALETTE_YUV420    10
#define VIDEO_PALETTE_YUV411    11  /* YUV411 capture */
#define VIDEO_PALETTE_RAW       12  /* RAW capture (BT848) */
#define VIDEO_PALETTE_YUV422P   13  /* YUV 4:2:2 Planar */
#define VIDEO_PALETTE_YUV411P   14  /* YUV 4:1:1 Planar */
#define VIDEO_PALETTE_YUV420P   15  /* YUV 4:2:0 Planar */
#define VIDEO_PALETTE_YUV410P   16  /* YUV 4:1:0 Planar */
#define VIDEO_PALETTE_PLANAR    13  /* start of planar entries */
#define VIDEO_PALETTE_COMPONENT 7   /* start of component entries */
};

struct video_audio
{
    int audio;          /* Audio channel */
    __u16   volume;     /* If settable */
    __u16   bass, treble;
    __u32   flags;
#define VIDEO_AUDIO_MUTE    1
#define VIDEO_AUDIO_MUTABLE 2
#define VIDEO_AUDIO_VOLUME  4
#define VIDEO_AUDIO_BASS    8
#define VIDEO_AUDIO_TREBLE  16  
    char    name[16];
#define VIDEO_SOUND_MONO    1
#define VIDEO_SOUND_STEREO  2
#define VIDEO_SOUND_LANG1   4
#define VIDEO_SOUND_LANG2   8
    __u16   umode;
    __u16   balance;    /* Stereo balance */
    __u16   step;       /* Step actual volume uses */
};

struct video_clip
{
    __s32   x,y;
    __s32   width, height;
    struct  video_clip *next;   /* For user use/driver use only */
};

struct video_window
{
    __u32   x,y;            /* Position of window */
    __u32   width,height;       /* Its size */
    __u32   chromakey;
    __u32   flags;
    struct  video_clip *clips;  /* Set only */
    int clipcount;
#define VIDEO_WINDOW_INTERLACE  1
#define VIDEO_CLIP_BITMAP   -1
/* bitmap is 1024x625, a '1' bit represents a clipped pixel */
#define VIDEO_CLIPMAP_SIZE  (128 * 625)
};

struct video_capture
{
    __u32   x,y;            /* Offsets into image */
    __u32   width, height;      /* Area to capture */
    __u16   decimation;     /* Decimation divder */
    __u16   flags;          /* Flags for capture */
#define VIDEO_CAPTURE_ODD       0   /* Temporal */
#define VIDEO_CAPTURE_EVEN      1
};

struct video_buffer
{
    void    *base;
    int height,width;
    int depth;
    int bytesperline;
};

struct video_mmap
{
    unsigned    int frame;      /* Frame (0 - n) for double buffer */
    int     height,width;
    unsigned    int format;     /* should be VIDEO_PALETTE_* */
};

struct video_key
{
    __u8    key[8];
    __u32   flags;
};


#define VIDEO_MAX_FRAME     32

struct video_mbuf
{
    int size;       /* Total memory to map */
    int frames;     /* Frames */
    int offsets[VIDEO_MAX_FRAME];
};
    

#define     VIDEO_NO_UNIT   (-1)

    
struct video_unit
{
    int     video;      /* Video minor */
    int vbi;        /* VBI minor */
    int radio;      /* Radio minor */
    int audio;      /* Audio minor */
    int teletext;   /* Teletext minor */
};

#define VIDIOCGCAP      _IOR('v',1,struct video_capability) /* Get capabilities */
#define VIDIOCGCHAN     _IOWR('v',2,struct video_channel)   /* Get channel info (sources) */
#define VIDIOCSCHAN     _IOW('v',3,struct video_channel)    /* Set channel  */
#define VIDIOCGTUNER        _IOWR('v',4,struct video_tuner)     /* Get tuner abilities */
#define VIDIOCSTUNER        _IOW('v',5,struct video_tuner)      /* Tune the tuner for the current channel */
#define VIDIOCGPICT     _IOR('v',6,struct video_picture)    /* Get picture properties */
#define VIDIOCSPICT     _IOW('v',7,struct video_picture)    /* Set picture properties */
#define VIDIOCCAPTURE       _IOW('v',8,int)             /* Start, end capture */
#define VIDIOCGWIN      _IOR('v',9, struct video_window)    /* Get the video overlay window */
#define VIDIOCSWIN      _IOW('v',10, struct video_window)   /* Set the video overlay window - passes clip list for hardware smarts , chromakey etc */
#define VIDIOCGFBUF     _IOR('v',11, struct video_buffer)   /* Get frame buffer */
#define VIDIOCSFBUF     _IOW('v',12, struct video_buffer)   /* Set frame buffer - root only */
#define VIDIOCKEY       _IOR('v',13, struct video_key)      /* Video key event - to dev 255 is to all - cuts capture on all DMA windows with this key (0xFFFFFFFF == all) */
#define VIDIOCGFREQ     _IOR('v',14, unsigned long)     /* Set tuner */
#define VIDIOCSFREQ     _IOW('v',15, unsigned long)     /* Set tuner */
#define VIDIOCGAUDIO        _IOR('v',16, struct video_audio)    /* Get audio info */
#define VIDIOCSAUDIO        _IOW('v',17, struct video_audio)    /* Audio source, mute etc */
#define VIDIOCSYNC      _IOW('v',18, int)           /* Sync with mmap grabbing */
#define VIDIOCMCAPTURE      _IOW('v',19, struct video_mmap)     /* Grab frames */
#define VIDIOCGMBUF     _IOR('v', 20, struct video_mbuf)    /* Memory map buffer info */
#define VIDIOCGUNIT     _IOR('v', 21, struct video_unit)    /* Get attached units */
#define VIDIOCGCAPTURE      _IOR('v',22, struct video_capture)  /* Get frame buffer */
#define VIDIOCSCAPTURE      _IOW('v',23, struct video_capture)  /* Set frame buffer - root only */

#define BASE_VIDIOCPRIVATE  192     /* 192-255 are private */


#define VID_HARDWARE_BT848  1
#define VID_HARDWARE_QCAM_BW    2
#define VID_HARDWARE_PMS    3
#define VID_HARDWARE_QCAM_C 4
#define VID_HARDWARE_PSEUDO 5
#define VID_HARDWARE_SAA5249    6
#define VID_HARDWARE_AZTECH 7
#define VID_HARDWARE_SF16MI 8
#define VID_HARDWARE_RTRACK 9
#define VID_HARDWARE_ZOLTRIX    10
#define VID_HARDWARE_SAA7146    11
#define VID_HARDWARE_VIDEUM 12  /* Reserved for Winnov videum */
#define VID_HARDWARE_RTRACK2    13
#define VID_HARDWARE_PERMEDIA2  14  /* Reserved for Permedia2 */
#define VID_HARDWARE_RIVA128    15  /* Reserved for RIVA 128 */
#define VID_HARDWARE_PLANB  16  /* PowerMac motherboard video-in */
#define VID_HARDWARE_BROADWAY   17  /* Broadway project */
#define VID_HARDWARE_GEMTEK 18
#define VID_HARDWARE_TYPHOON    19
#define VID_HARDWARE_VINO   20  /* Reserved for SGI Indy Vino */
#define VID_HARDWARE_CADET  21  /* Cadet radio */
#define VID_HARDWARE_TRUST  22  /* Trust FM Radio */

/*
 *  Initialiser list
 */
 
struct video_init
{
    char *name;
    int (*init)(struct video_init *);
};

#ifdef __cplusplus
}
#endif

#endif
